// #include <climits>
// #include <iostream>
// #include <vector>
// using namespace std;
// vector<vector<int>> a(10100);
// vector<int> w(10100);
// vector<int> nums(10100);
// int dfs(int x) {
//     if(nums[x]) {
//         return nums[x];
//     }
//     int maxPath = w[x];
//     for(auto& s : a[x]) {
//         maxPath = max(maxPath, dfs(s) + w[x]);
//     }
//     nums[x] = maxPath;
//     return maxPath;
// }
// int main() {
//     int n;
//     cin >> n;
//     int ret = -1;
//     for(int i = 1; i <= n; i++) {
//         int x, y;
//         cin >> x >> y;
//         w[x] = y;
//         while(1) {
//             int temp;
//             cin >> temp;
//             if(temp == 0) {
//                 break;
//             }
//             a[x].push_back(temp);
//         }
//         int t = dfs(x);
//         // cout << t << endl;  // 输出当前节点的最大路径和
//         ret = max(t, ret);
//     }
//     cout << ret << endl;
//     return 0;
// }




#include <climits>
#include <iostream>
#include <vector>
using namespace std;
vector<vector<int>> a(10100);
vector<int> w(10100);
int Max = -1;
int dfs(int x) {
    if(a[x].size() == 0) {
        return w[x];
    }
    for(auto& s : a[x]) {
        Max = max(Max, dfs(s) + w[x]);
        cout << w[x] << endl;
        cout << "----" << endl;
        cout << Max << endl;
    }
    return Max;
}
int main() {
    int n;
    cin >> n;
    int ret = -1;
    for(int i = 1; i <= n; i++) {
        int x, y;
        cin >> x >> y;
        w[x] = y;
        while(1) {
            int temp;
            cin >> temp;
            if(temp == 0) {
                break;
            }
            a[x].push_back(temp);
        }
        cout << "jjjjj" << endl;
        int t = dfs(x);
        cout << "hhhhhhh" << endl;
        cout << t << endl;
        Max = -1;
        ret = max(t, ret);
    }
    cout << ret << endl;
    return 0;
}